---
id: dbcontext-seed-data
title: 9.21 实体种子数据
sidebar_label: 9.21 实体种子数据
---

## 9.21.1 什么是种子数据

在 `Fur` 框架种，种子数据通常指的是通过程序为数据库预先设置一些初始化数据，比如我们的数据字典表，我们可能希望在系统构建初期就自动将一些规范化数据保存到数据库中。

如性别：男/女，地区，行业信息等等。

## 9.21.2 如何配置

`Fur` 提供非常灵活方便的 `IEntitySeedData<TEntity>` 依赖接口可以快速的构建种子数据，支持任何无参构造函数对象类中使用。如我们需要为 `Person` 表插入初始化数据：

### 9.21.2.1 在实体定义中使用

```cs {7,16-23}
using Fur.DatabaseAccessor;
using System;
using System.Collections.Generic;

namespace Fur.Core
{
    public class Person : EntityBase, IEntitySeedData<Person>
    {
        public string Name { get; set; }

        public int Age { get; set; }

        public string Address { get; set; }

        // 配置种子数据
        public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
        {
            return new List<Person>
            {
                new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
                new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
            };
        }
    }
}
```

:::important 特别注意

`主键` 值必须手动插入，因为会自动关闭主键或自增标识检查。

:::

### 9.21.2.2 在任意对象类中使用

```cs {6,9-16}
using Fur.DatabaseAccessor;
using System.Collections.Generic;

namespace Fur.Application
{
    public class PersonSeedData : IEntitySeedData<Person>
    {
        // 配置种子数据
        public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
        {
            return new List<Person>
            {
                new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
                new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
            };
        }
    }
}
```

## 9.21.3 导航属性

通常我们的实体有 `一对多`，`多对多`等外键关系，那么**我们需要单独为每一个实体添加数据种子，而不是直接写在主表中。**

## 9.21.4 多个数据库种子数据

`Fur` 提供泛型的方式支持多个数据库种子数据设定，如：

```cs {6,9-16}
using Fur.DatabaseAccessor;
using System.Collections.Generic;

namespace Fur.Application
{
    public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
    {
        // 配置种子数据
        public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
        {
            return new List<Person>
            {
                new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
                new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
            };
        }
    }
}
```

上面的例子表示同时为 `MySqlDbContext` 和 `SqliteDbContext` 创建种子数据。

## 9.21.5 反馈与建议

:::note 与我们交流

给 Fur 提 [Issue](https://gitee.com/monksoul/Fur/issues/new?issue)。

:::

---

:::note 了解更多

想了解更多 `数据种子` 知识可查阅 [EF Core - 数据种子设定](https://docs.microsoft.com/zh-cn/ef/core/modeling/data-seeding) 章节。

:::